/*!
 * # [198.打家劫舍](https://leetcode.cn/problems/house-robber/description/)
 *
 * @lc app=leetcode.cn id=198 lang=rust slug=house-robber
 *
 * ## 难度
 *
 * Medium (54.58%)
 *
 * ## 描述
 *
 * 你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
 *
 * 给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。
 * 
 * ## 示例 1：
 * - 输入：[1,2,3,1]
 * - 输出：4
 * - 解释：偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。
 *
 * ## 示例 2：
 * - 输入：[2,7,9,3,1]
 * - 输出：12
 * - 解释：偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9)，接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。
 * 
 *
 * ## 测试用例: 
 * [1,2,3,1]
 */
struct Solution;
// @lc code=start
impl Solution {
    /// ## 打家劫舍
    /// - 动态规划
    /// 1. 设dp[i]: 以nums[..i]偷窃房屋的偷窃方案偷到的最高金额；
    /// 2. 递推关系: dp[i] = max(dp[i-2] + nums[i-1], dp[i-1])
    /// 3. 初始条件：
    ///    dp[0] = 0;
    ///    dp[1] = nums[0]
    pub fn rob(nums: Vec<i32>) -> i32 {
        nums.iter()
            .fold((0, 0), |acc, i| (acc.1, acc.1.max(acc.0 + i)))
            .1
    }
}
// @lc code=end
//
#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test() {
        assert_eq!(Solution::rob(vec![2,7,9,3,1]), 12);
    }
}
